﻿Shader "FLL/chapter6/逐像素光照"
{
    Properties
    {
        _Diffuse("[漫反射] diffuse",Color)=(1,1,1,1)
    }
    SubShader
    {
        pass{
            //声明这个pass的光照模式
            Tags{"LightMode"="ForwardBase"}

            CGPROGRAM
            //预编译程序
            #pragma vertex vert
            #pragma fragment frag 
            // 需要使用unity内置的一些变量 _LightMode0
            #include "Lighting.cginc"   

            //引用"属性"里的变量建立链接
            fixed4 _Diffuse;

            struct a2v{
                float4 vertex:POSITION;
                float3 normal:NORMAL;
            };
            struct v2f{
                float4 pos:SV_POSITION;
                float3 worldNormal:TEXCOORD0;    
            };
            
           
            v2f vert(a2v v){
                //声明变量
                v2f o;

                //将坐标从模型空间转换到裁剪空间
                o.pos=UnityObjectToClipPos(v.vertex);
                //将法线方向从模型空间转化到世界空间
                o.worldNormal=mul(v.normal,(float3x3)unity_WorldToObject);

                return o;
            }
            //在逐像素光照下在片元shader下计算每一个片元颜色,不用靠个别顶点颜色来插值
            fixed4 frag(v2f i):SV_TARGET{
                //获得环境光颜色
                float3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz;
                //得到世界空间的法线方向 归一化即可
                float3 worldNormal=normalize(i.worldNormal);
                //获得世界空间的光源方向
                float3 worldLightDir=normalize(_WorldSpaceLightPos0.xyz);
                // //物体漫反射颜色=光源颜色*物体表面颜色*Lambert公式算出来的物体表面光源强度
                float3 diffuse=_LightColor0.rgb*_Diffuse.rgb*saturate(dot(worldLightDir,worldNormal));

                //最终颜色=环境光+物体漫反射颜色
                float3 color=diffuse+ambient;
                return float4(color,1.0);
            }


            ENDCG
        }
 
    }
    FallBack "Diffuse"
}